# -*-coding: Utf-8 -*-
# @File : admin_interface .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2024/5/7
from db import Admin, School, Course, Teacher
from typing import Any
from lib import Tools


class AdminInterface(object):
    def __init__(self):
        self.tools = Tools()

    def create_school_interface(self, username: str, school_name: str,
                                school_addr: str, school_desc: str) -> bool:
        '''
        管理员创建学校接口
        :param username: 当前登录用户名
        :param school_name: 学校名称
        :param school_addr: 学校地址
        :param school_desc: 学校简介
        :return: 创建成功失败，原因
        '''
        # 【一】获取所有学校的列表
        flag, school_name_list = School.show_name()
        # 【二】判断当前用户输入的学校名字是否存在
        if school_name in school_name_list:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'添加学校信息失败!原因是当前学校已存在!')
            return False
        # 【三】当前学校信息不存在则创建学校信息
        School(name=school_name, addr=school_addr, desc=school_desc).save()
        self.tools.log_info(tag='info', role="Admin", username=username,
                            info=f"添加学校 {school_name} 信息成功!")
        return True

    def create_course_interface(self, username: str, course_name: str,
                                course_price: str, course_period: str) -> bool:
        '''
        管理员创建课程接口
        :param username: 当前登录用户名
        :param course_name: 课程名称
        :param course_price: 课程周期
        :param course_period: 课程价格
        :return: 创建成功失败，原因
        '''
        # 【一】校验当前课程是否已存在
        flag, course_name_list = Course.show_name()
        if course_name in course_name_list:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'添加课程信息失败!原因是当前课程已存在!')
            return False
        # 【二】校验当前课程周期格式
        flag, course_period = self.tools.verify_tools.is_number(number=course_period)
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'添加课程信息失败!原因是{course_period}!')
            return flag
        # 【三】校验当前课程价格格式
        flag, course_price = self.tools.verify_tools.is_number(number=course_price)
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'添加课程信息失败!原因是{course_price}!')
            return flag
        # 【四】当前课程不存在则创建课程信息
        Course(name=course_name, price=course_price, period=course_period).save()
        # 【五】返回当前信息
        self.tools.log_info(tag='info', role="Admin", username=username,
                            info=f"添加课程 {course_name} 信息成功!")
        return True

    def create_teacher_interface(self, username: str, teacher_name: str, teacher_password: str) -> bool:
        '''
        创建讲师信息接口
        :param username: 当前登录用户名
        :param teacher_name: 讲师姓名(登陆账号)
        :param teacher_password: 讲师登陆密码
        :return: 创建成功失败,原因
        '''
        # 【一】获取所有讲师名单
        flag, teacher_name_list = Teacher.show_name()
        # 【二】判断当前讲师姓名是否存在于当前名单中
        if teacher_name in teacher_name_list:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'讲师信息注册失败!原因是讲师已存在!')
            return False
        # 【三】讲师不存在，允许注册
        # 【1】获取加密时候需要用到的盐
        salt = self.tools.salt
        # 【2】校验密码格式
        flag, teacher_password = self.tools.verify_tools.verify_login_password(password=teacher_password)
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'讲师信息注册失败!原因是{teacher_password}!')
            return False
        # 【3】加密密码
        password = self.tools.encrypted_data(data=teacher_password, salt=salt)
        # 【四】保存当前讲师的个人信息
        Teacher(name=teacher_name, password=password, salt=salt).save()
        # 【五】记录日志
        self.tools.log_info(tag='info', role="Admin", username=username,
                            info=f"注册讲师 {teacher_name} 信息成功!")
        return True

    def school_add_course_interface(self, username: str, school_obj: School, course_obj: Course) -> bool:
        '''
        学校添加课程接口
        :param username: 当前登录用户名
        :param school_obj: 学校对象
        :param course_obj: 课程对象
        :return: 添加成功失败,原因
        '''
        # 【一】判断当前学校是否存在
        if not school_obj:
            info = self.tools.log_info(tag='warning', role="Admin", username=username,
                                       info=f'选择学校失败!原因是不存在该学校!')
            return False
        # 【二】判断当前课程是否存在
        if not course_obj:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'选择课程失败!原因是不存在该课程!')
            return False
        # 【五】校验当前学校是否绑定过当前课程对象数据
        if course_obj in school_obj.courses_list:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'选择课程失败!原因是该学校 {school_obj.name} 已经添加过当前课程 {course_obj.name} !')
            return False
        # 【六】当前学校不存在当前课程则新增当前课程数据
        school_obj.courses_list.append(course_obj)
        # 【七】判断当前课程是否已经有被关联的学校了
        if course_obj.school:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'选择课程失败!原因是该课程 {course_obj.name} 已经有关联学校 {course_obj.school.name} !')
            return False
        # 【八】课程反向关联学校
        course_obj.school = school_obj.name
        # 【九】保存当前学校数据和课程数据
        school_obj.save()
        course_obj.save()
        self.tools.log_info(tag='info', role="Admin", username=username,
                            info=f'学校添加课程成功!学校{school_obj.name}已关联课程{course_obj.name} !')
        return True

    def __show_info_interface(self, tag: str, cls: Any, username: str) -> bool:
        '''
        公共展示信息接口
        :param tag: 那种类型
        :param cls: 当前类
        :param username: 当前登录用户名
        :return:
        '''
        flag, msg = cls.show_data_info()
        if not flag:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'查看{tag}信息失败 !')
            return False
        self.tools.log_info(tag='warning', role="Admin", username=username,
                            info=f'查看{tag}信息成功 !')
        return True

    def show_all_course_interface(self, username: str) -> bool:
        '''
        展示所有课程信息
        :param username: 当前登录用户名
        :return:
        '''
        return self.__show_info_interface(tag="课程", cls=Course, username=username)

    def show_all_school_interface(self, username: str) -> bool:
        '''
        展示所有学校信息
        :param username: 当前登录用户名
        :return:
        '''
        return self.__show_info_interface(tag="学校", cls=School, username=username)

    def show_teach_course_interface(self, username: str) -> bool:
        '''
        展示每一个讲师的授课信息
        :param username: 当前登录用户名
        :return:
        '''
        return self.__show_info_interface(tag="讲师授课信息", cls=Teacher, username=username)

    def chose_teacher_course_interface(self, username: str,
                                       course_obj: Course, teacher_obj: Teacher) -> bool:
        '''
        管理员添加讲师授课信息
        :param username: 当前登录用户名
        :param course_obj: 课程对象
        :param teacher_obj: 讲师对象
        :return:
        '''
        # 【一】判断当前讲师是否存在
        if not teacher_obj:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'选择讲师信息失败!原因是当前编号对应的讲师不存在 !')
            return False
        # 【二】判断当前课程是否存在
        if not course_obj:
            self.tools.log_info(tag='warning', role="Admin", username=username,
                                info=f'选择课程信息失败!原因是当前编号对应的课程不存在 !')
            return False
        # 【三】判断当前讲师是否已经存在当前课程
        if hasattr(teacher_obj, 'courses_list'):
            courses_name_list = [_course_obj.name for _course_obj in getattr(teacher_obj, 'courses_list')]
            if course_obj.name in courses_name_list:
                self.tools.log_info(tag='warning', role="Admin", username=username,
                                    info=f'添加课程信息失败!原因是当前课程 {course_obj.name} 已在 {teacher_obj.name} 授课名单中 !')
                return False
        else:
            teacher_obj.courses_list = []
        # 【四】讲师没有授课信息，添加授课信息
        teacher_obj.courses_list.append(course_obj)
        course_obj.teacher = teacher_obj
        # 【五】保存信息
        teacher_obj.save()
        course_obj.save()
        # 【六】记录日志
        self.tools.log_info(tag='info', role="Admin", username=username,
                            info=f'添加课程信息成功!已将当前课程 {course_obj.name} 添加到 {teacher_obj.name} 授课名单中 !')
        self.tools.log_info(tag='info', role="Teacher", username=teacher_obj.name,
                            info=f'添加课程信息成功!已将当前课程 {course_obj.name} 添加到 授课名单中 !')
        return True
